<HTML>
<HEAD>
   <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-2">
   <META NAME="Author" CONTENT="Tams Juray">
   <META NAME="GENERATOR" CONTENT="Mozilla/4.04 [en] (Win95; I) [Netscape]">
   <META NAME="KeyWords" CONTENT="JavaScript, HTML, cookies">
   <TITLE>Cookies</TITLE>
<SCRIPT LANGUAGE="JavaScript">
<!-- A kd elrejtse

function openwin(url){
  open(url);
}

// -->
</SCRIPT>
</HEAD>
<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000EE" VLINK="#000099" ALINK="#FF0000">

<CENTER><FONT SIZE=+3>A JavaScript</FONT></CENTER>


<FONT SIZE=+1>11. fejezet:</FONT> <FONT SIZE=+2>A "s&uuml;tik"</FONT>

<P>El&eacute;rkezt&uuml;nk utols&oacute; t&eacute;m&aacute;nkhoz a "s&uuml;tikhez",
angol nev&eacute;n cookies. Mire j&oacute;k ezek? Tudjuk, hogy a HyperText
Transfer Protocoll-t (HTTP) nem alkalmas arra, hogy kapcsolatot teremtsen
k&eacute;t felhaszn&aacute;l&oacute;i (kliens) k&eacute;r&eacute;s k&ouml;z&ouml;tt.
Tegy&uuml;k fel p&eacute;ld&aacute;ul, hogy egy olyan oldalt szeretn&eacute;nk
k&eacute;sz&iacute;teni, amely felismeri azt, hogy ha valaki m&aacute;r
nem az els&otilde; alkalommal l&aacute;togatja meg, &eacute;s ismerve azt,
hogy&nbsp; el&otilde;z&otilde;leg milyen t&eacute;m&aacute;kat tartalmaz&oacute;
oldalakat j&aacute;rt be az illet&otilde;, most m&aacute;shov&aacute; k&uuml;ldi.

<P>A s&uuml;tik seg&iacute;ts&eacute;g&eacute;vel adatokat t&aacute;rolhatunk
a felhaszn&aacute;l&oacute; g&eacute;p&eacute;n. Persze nem kell megijedni,
ezek l&eacute;nyeg&eacute;ben vesz&eacute;lytelen inform&aacute;ci&oacute;k,
m&eacute;gpedig a <B>cookies.txt</B> &aacute;llom&aacute;nyban megjelen&otilde;
sz&ouml;veges bejegyz&eacute;sek. Form&aacute;tumuk a k&ouml;vetkez&otilde;:
<PRE><I>n&eacute;v=&eacute;rt&eacute;k;</I>expires<I>=d&aacute;tum;</I></PRE>
El&otilde;sz&ouml;r megadjuk az adat nev&eacute;t, majd az egyenl&otilde;s&eacute;g
m&aacute;sik oldal&aacute;n az adat &eacute;rt&eacute;ke &aacute;ll. Ha
a <B>n&eacute;v</B> ill. az <B>&eacute;rt&eacute;k</B> tartalmaz <B>vessz&otilde;,
pontosvessz&otilde; vagy sz&oacute;k&ouml;z</B> karaktereket, akkor az
<B>escape()</B> f&uuml;ggv&eacute;nyt kell felhaszn&aacute;lni, hogy megfelel&otilde;
form&aacute;ban k&oacute;doljuk, &eacute;s az <B>unescape()</B> f&uuml;ggv&eacute;nyt,
hogy visszak&oacute;dolhassuk.

<P>Az expires mez&otilde; tartalmazza az &eacute;rv&eacute;nyess&eacute;g
d&aacute;tum&aacute;t. A d&aacute;tumot GMT form&aacute;tumban kell megadni,
amely a k&ouml;vetkez&otilde;:
<PRE>Nap, NN-HHH-&Eacute;&Eacute; &Oacute;&Oacute;:PP:MP GMT</PRE>
P&eacute;ld&aacute;ul: Wed, 12-Mar-98&nbsp; 12:23:45 GMT

<P>Ez 1998. m&aacute;rcius 12-&eacute;t, egy szerdai napot (Wed) ad meg,
eg&eacute;szen pontosan 12 &oacute;ra 23 perc 45 m&aacute;sodpercet.

<P>Egyszer&ucirc;bben &uacute;gy adhatunk meg ilyen form&aacute;tum&uacute;
id&otilde;t. hogy a Date &aacute;ltal visszaadott d&aacute;tumot a <B>toGMTString()</B>
f&uuml;ggv&eacute;nnyel ilyen form&aacute;tum&uacute;ra hozzuk.

<P><A NAME="szorit"></A><FONT SIZE=+1>Megszor&iacute;t&aacute;sok</FONT>

<P>A "s&uuml;tikre" az al&aacute;bbi korl&aacute;toz&aacute;sok &eacute;rv&eacute;nyesek:
<UL>
<LI>
legfeljebb 300 ilyen bejegyz&eacute;s lehet a <B>cookies.txt</B> file-ban</LI>

<LI>
egy bejegyz&eacute;s m&eacute;rete legfeljebb 4Kb</LI>

<LI>
Szerverenk&eacute;nt vagy domain-enk&eacute;nt legfeljebb 20 "s&uuml;ti"
lehet</LI>
</UL>
<A NAME="JSCOOKIE"></A><FONT SIZE=+1>A "s&uuml;tik" &eacute;s a JavaScript</FONT>

<P>A <B>dokument</B> objektum <B>cookies</B> mez&otilde;je egy sztring,
amely tartalmazza a Netscape Navigator &ouml;sszes bejegyz&eacute;s&eacute;t,
ami a <B>cookies.txt</B> &aacute;llom&aacute;nyban tal&aacute;lhat&oacute;.

<P>A "s&uuml;tikkel" a k&ouml;vetkez&otilde;ket tehetj&uuml;k:
<UL>
<LI>
be&aacute;ll&iacute;thatjuk az &eacute;rt&eacute;k&eacute;t illetve az
&eacute;rv&eacute;nyess&eacute;gi idej&eacute;t</LI>

<LI>
megkaphatjuk az &eacute;rt&eacute;k&eacute;t a megadott nev&ucirc; "s&uuml;tinek"</LI>
</UL>
A Netscape dokument&aacute;ci&oacute;ja a k&ouml;vetkez&otilde; f&uuml;ggv&eacute;nyeket
javasolja ezen m&ucirc;veletek elv&eacute;g&eacute;zs&eacute;hez:

<P>1. az &eacute;rt&eacute;k &eacute;s az opcion&aacute;lis &eacute;rv&eacute;nyess&eacute;gi
id&otilde; be&aacute;ll&iacute;t&aacute;sa:

<span style="background:black; color:yellow; width:500; font-weight:bold; font-size:large;">
<PRE>function setCookie(name, value, expire) {
&nbsp; document.cookie = name + "=" + escape(value)
&nbsp; + ((expire == null) ? "" : ("; expires=" + expire.toGMTString()))
}</PRE>
</span><p>

A f&uuml;ggv&eacute;ny m&ucirc;k&ouml;d&eacute;se rendk&iacute;v&uuml;l
egyszer&ucirc;. Param&eacute;terk&eacute;nt adjuk &aacute;t a cookie nev&eacute;t,
&eacute;rt&eacute;k&eacute;t, &eacute;rv&eacute;nyess&eacute;gi d&aacute;tum&aacute;t.
A f&uuml;ggv&eacute;ny a <B>name</B> (n&eacute;v) param&eacute;ternek olyan
sztringet v&aacute;r, amelyben nincs az el&otilde;z&otilde;ekben eml&iacute;tett
speci&aacute;lis karakter. A <B>value</B> sztringet k&oacute;doljuk az
<B>escape()</B> f&uuml;ggv&eacute;nnyel, hogy a sztringben l&eacute;v&otilde;
pontosvessz&otilde;k, vessz&otilde;k, sz&oacute;k&ouml;z&ouml;k helyesen
ker&uuml;ljenek t&aacute;rol&aacute;sra, majd hozz&aacute;f&ucirc;zz&uuml;k
a <B>name</B> sztringhez. Ha nem adtunk meg d&aacute;tumot (azaz a param&eacute;ter
&eacute;rt&eacute;ke null), akkor egy &uuml;res sztringet, ellenkez&otilde;
esetben a <B>toGMTString()</B> f&uuml;ggv&eacute;nnyel GMT form&aacute;tumra
hozott sztringet f&ucirc;zz&uuml;k az el&otilde;z&otilde;ekhez.

<P>2. adott nev&ucirc; cookie &eacute;rt&eacute;k&eacute;nek visszaad&aacute;sa
<p>
<span style="background:black; color:yellow; width:500; font-weight:bold; font-size:large;">
<PRE>function getCookie(Name){
&nbsp; var search = Name + "=";
&nbsp; if (document.cookie.length > 0){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // megvizsg&aacute;ljuk, hogy vannak-e cookie-k
&nbsp;&nbsp;&nbsp; offset = document.cookie.indexOf(search);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // ha igen, megkeress&uuml;k az adott nev&ucirc; elej&eacute;t
&nbsp;&nbsp;&nbsp; if (offset != -1){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // ha van ilyen akkor:&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; offset += search.length;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end = document.cookie.indexOf(";", offset);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // az <B>end </B>egyenl&otilde; a vizsg&aacute;lt cookie v&eacute;g&eacute;t lez&aacute;r&oacute; ; hely&eacute;vel
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (end == -1) end = document.cookie.length;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // ha nincs pontosvessz&otilde; akkor end egyenl&otilde; a cookie sztring hossz&aacute;val
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return unescape(document.cookie.substring(offset, end));
&nbsp;&nbsp;&nbsp; }
&nbsp; }
}</PRE>
</span><p>

A f&uuml;ggv&eacute;ny a <B>search</B> sztringbe helyezi a keresend&otilde;
nev&ucirc; cookie elej&eacute;t (azaz a nevet &eacute;s az azt k&ouml;vet&otilde;
"=" jelet). Ha a <B>document.cookie</B> sztring hossza nagyobb 0-n&aacute;l,
akkor tartalmaz bejegyz&eacute;seket. Ebben az esetben megn&eacute;zz&uuml;k
a m&aacute;r ismert <B>indexof()</B> f&uuml;ggv&eacute;ny seg&iacute;ts&eacute;g&eacute;vel,
hogy l&eacute;tezik-e a keresett bejegyz&eacute;s. Ha nem, akkor az <B>offset</B>
tartalma -1 lesz, ellenkez&otilde; esetben az <B>offset</B> tartalma a
search sztring els&otilde; poz&iacute;ci&oacute;ja. Ekkor megkeress&uuml;k
a cookie v&eacute;g&eacute;t jelz&otilde; pontosvessz&otilde; poz&iacute;ci&oacute;j&aacute;t.
Ez ker&uuml;l az <B>end</B> v&aacute;ltoz&oacute;ba. Ha ilyen nincs, akkor
a cookie v&eacute;ge a <B>document.cookie</B> sztring v&eacute;ge lesz.
Legv&eacute;g&uuml;l pedig visszaadjuk az <B>unescape()</B> f&uuml;ggv&eacute;nnyel
helyesen dek&oacute;dolt cookie-t, ami a <B>document.cookie</B> sztring
<B>offset</B> &eacute;s <B>end</B> poz&iacute;ci&oacute;k k&ouml;z&ouml;tti
r&eacute;sze lesz.

<P><A NAME="pelda"></A><FONT SIZE=+1>P&eacute;lda a "s&uuml;ti" haszn&aacute;lat&aacute;ra</FONT>

<P>Az al&aacute;bbi gombra kattintva megtekinthetj&uuml;k a fejezetet lez&aacute;r&oacute;,
az eddig tanultakat bemutat&oacute; p&eacute;ld&aacute;t m&ucirc;k&ouml;d&eacute;s
k&ouml;zben.

<P><FORM><INPUT TYPE="button" VALUE="Plda" onClick="openwin('pelda.htm')"></FORM>

<P>A k&oacute;d pedig a k&ouml;vetkez&otilde;:
<P>
<span style="background:black; color:yellow; width:500; font-weight:bold; font-size:large;">
<PRE>&lt;HTML>
&lt;HEAD>
&lt;SCRIPT LANGUAGE="JavaScript">
&lt;!-- JavaScript k&oacute;d rejt&eacute;se

function setCookie(name, value, expire) {
&nbsp; document.cookie = name + "=" + escape(value)
&nbsp; + ((expire == null) ? "" : ("; expires=" + expire.toGMTString()));
}

function getCookie(Name){
&nbsp; var search = Name + "=";
&nbsp; if (document.cookie.length > 0){
&nbsp;&nbsp;&nbsp; offset = document.cookie.indexOf(search);
&nbsp;&nbsp;&nbsp; if (offset != -1){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; offset += search.length;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end = document.cookie.indexOf(";", offset);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (end == -1) end = document.cookie.length;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return unescape(document.cookie.substring(offset, end));
&nbsp;&nbsp;&nbsp; }
&nbsp; }
}

// -->
&lt;/SCRIPT>
&lt;/HEAD>

&lt;BODY>

&lt;SCRIPT LANGUAGE="JavaScript">
&lt;!--

var user = getCookie("greeting");

if (user == null){
&nbsp; user = prompt("K&ouml;sz&ouml;ntelek ezen az oldalon! K&eacute;rlek &iacute;rd be a neved!","");
&nbsp;&nbsp;
&nbsp; if (user == null){
&nbsp;&nbsp;&nbsp; alert("Nem &iacute;rtad be a neved ez&eacute;rt a tov&aacute;bbiakban \"Fantomnak\" nevezlek!");
&nbsp;&nbsp;&nbsp; user = "Fantom";
&nbsp; }

&nbsp; expDate = new Date();
&nbsp; expDate.setTime(expDate.getTime() + (365*24*60*60*1000));
&nbsp;&nbsp;
&nbsp; setCookie('greeting',user,expDate);
&nbsp; document.write("Ha legk&ouml;zelebb visszat&eacute;rsz, m&aacute;r megismerlek!");
}
else{
&nbsp; document.write("&Uuml;dv&ouml;z&ouml;llek ism&eacute;t ezen az oldalon "+user+"! L&aacute;tom visszat&eacute;rt&eacute;l.");
}

//-->
&lt;/SCRIPT>

&lt;/BODY>
&lt;/HTML></PRE>
</span><p>


R&ouml;gt&ouml;n az elej&eacute;n lek&eacute;rdezz&uuml;k a <B>getCookie()
</B>f&uuml;ggv&eacute;nnyel, hogy l&eacute;tezik-e a <B>"greeting"</B>
bejegyz&eacute;s. Ha nem, akkor megjelen&iacute;t&uuml;nk egy input ablakot
a <B>prompt()</B> f&uuml;ggv&eacute;nnyel. Ha a felhaszn&aacute;l&oacute;
nem &iacute;rt be semmit, akkor a <B>user</B> sztring tov&aacute;bbra is
<B>null</B>, ez&eacute;rt egy alap&eacute;rtelmezett &eacute;rt&eacute;ket
adunk neki (<B>Fantom</B>). Majd l&eacute;trehozzuk az <B>expDate</B> objektumot
(&eacute;rv&eacute;nyess&eacute;gi d&aacute;tum), ami az aktu&aacute;lis
d&aacute;tumot tartalmazza. Ezt az &eacute;rt&eacute;ket megn&ouml;velj&uuml;k
1 &eacute;vvel (ezredm&aacute;sodpercekben sz&aacute;molva; 365*2*60*60*1000),
majd a <B>setCookie()</B> f&uuml;ggv&eacute;nnyel be&iacute;rjuk a user
&eacute;rt&eacute;ket illetve az &eacute;rv&eacute;nyess&eacute;gi d&aacute;tum
&eacute;rt&eacute;k&eacute;t. Ennek hat&aacute;s&aacute;ra, ha az elk&ouml;vetkezend&otilde;
1 &eacute;vben visszat&eacute;r&uuml;nk a p&eacute;ld&aacute;t tartalmaz&oacute;
oldalra, akkor az adott oldal felismer benn&uuml;nket. Ha a <B>"greeting"</B>
bejegyz&eacute;s m&aacute;r kor&aacute;bban l&eacute;tezett, akkor nincs
m&aacute;s dolgunk, mint megjelen&iacute;teni azt az &eacute;rt&eacute;ket,
ami a kor&aacute;bban m&aacute;r ott j&aacute;rt felhaszn&aacute;l&oacute;
nev&eacute;t tartalmazza.
<CENTER>[ <A HREF="../12/befejez.htm">Befejez&eacute;s</A> ] [ <A HREF="../index.htm">Tartalomjegyz&eacute;k</A>]
[ <A HREF="../10/layer2.htm">10. fejezet</A> ]</CENTER>

</BODY>
</HTML>
